package com.ruoyi.web.controller.example;


import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.BlizException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.BindException;

@Anonymous
@Api(tags = "文件管理相关内容")
@RestController
public class FileController {

//    定义好文件上传的路径
    @Value("${ruoyi.profile}")
    private String UPLOAD_PATH;
    @ApiOperation(value = "文件上传")
    @PostMapping("/FileUpload")
//    文件上传相关的方法
    public AjaxResult FileController(@RequestPart("myFile") MultipartFile file){

//        第一步，先判断文件是否为空
//        如何判断？有一个现成方法
        if (file.isEmpty()) {
            return AjaxResult.error(500,"上传的文件为空");
        }

//        第1.5步，文件大小的判断，在application.yml中已经帮我们配置好了


//        第二步，获取文件的名称，并且进行文件类型的判断
//        加入上传的图片叫 abc.jpg ，那么FileName此时就等于“abc.jpg”，格式为字符串
        String FileName = file.getOriginalFilename();

//        System.out.println("上传的文件名称是：" +FileName);
//        第三步，判断文件的类型是否符合需求，比如我们只想获取图片类型
//        先定义好，我们接受那些类型，例如常见的图片类型有：jpg、jpeg、png
//        获取我们文件的后缀名，判断是否在我们的需求范围内即可
//        字符串的分割，通过 “ . ” 来把文件名称进行分割，获取到后缀
        String[] arrs = FileName.split("\\.");

//        System.out.println("数组的长度是：" + arrs.length);
//        获取文件后缀 abc.jpg 变成了 arrs = [abc.jpg]
//        数据下标是从0开始的，想要获取最后一位，是数组的长度-1
        String suffix = arrs[arrs.length-1];
        suffix = suffix.toLowerCase();//大写转换成小写， 为了JPG,JPEG,PNG
        if (!suffix.equals("jpg")  && !suffix.equals("jpeg") && !suffix.equals("png")) {
            return AjaxResult.error(500,"只能上传jpg、jpeg、png格式的文件");
        }

        File path = new File(UPLOAD_PATH);
//        如果路径不存在，就创建一个
//        这里如果你定义路径在C盘，可能存在创建不成功的情况
        if (!path.exists()){
            path.mkdir();
        }

        File dest = new File(UPLOAD_PATH + "/" + FileName);
        try {
            file.transferTo(dest);
        } catch (IOException e) {
            System.out.println("失败了，原因是：" +e.getMessage());
            throw new BlizException(500,"文件保存失败");
        }

        return AjaxResult.success("传输成功");
    }
    //文件下载相关方法
    @GetMapping("/Download")
    @ApiOperation(value = "文件下载")
    public ResponseEntity<InputStreamResource> Download(@RequestParam("name") String name) {
        FileSystemResource file = new FileSystemResource(UPLOAD_PATH + "/" + name);
        //固定写法
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-control","no-cache,no-store,must-revalidate");
        headers.add("Content-Disposition",
                String.format("attachment; filename=\"%s\"",file.getFilename()));
        headers.add("Pragma","no-cache");
        headers.add("Expires","0");
        //固定写法
        try {
            return ResponseEntity
                    .ok()
                    .headers(headers)
                    .contentLength(file.contentLength())
                    .contentType(MediaType.parseMediaType("application/octet-stream"))
                    .body(new InputStreamResource(file.getInputStream()));
        } catch (IOException e) {
            throw new BlizException(500,"文件下载失败");
        }
    }

}
